package com.webserver.core;

import com.webserver.http.HttpServletRequest;
import com.webserver.http.HttpServletResponse;

import java.io.File;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;

/**
 * 处理请求环节
 */
public class DispatcherServlet {
    //表示sources下的static目录，实际是运行时是编译后target/classes下的static目录
    private static File staticDir;
    static {
        try {
            staticDir = new File(
                    ClientHandler.class.getClassLoader().getResource(
                            "./static"
                    ).toURI()
            );
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }
    public void service(HttpServletRequest request, HttpServletResponse response){
        String path = request.getUri();
        System.out.println("请求路径："+path);
        //临时测试：将resource中static/myweb/index.html响应浏览器
            /*
                实际开发中，我们常用的相对路径都是类的加载路径。对应的写法:
                类名.class.getClassLoader().getResource("./")
                这里的"./"当前目录指的就是类加载路径的开始目录。它的实际位置
                JVM理解的就是当前类的包名指定中最上级包的上一层。
                例如下面的代码中，当前类ClientHandler指定的包:
                package com.webserver.core;
                那么包的最上级就是com，因此类加载路径的开始目录就是com的上级目录
                实际就是项目的target/classes这个目录了。
             */
        //去static目录下根据用户请求的抽象路径定位下面的文件
        File file = new File(staticDir,path);
        if (file.isFile()) {//实际存在的文件
            response.setContentFile(file);
            String name = file.getName();

//            String s = name.substring(name.lastIndexOf(".")+1);
//            if ("html".equals(s) || "css".equals(s)){
//                response.addHeader("Content-Type","text/"+s);
//            }else if("js".equals(s)){
//                response.addHeader("Content-Type","application/javascript");
//            }else if ("png".equals(s) || "gif".equals(s) ){
//                response.addHeader("Content-Type","image/"+s);
//            }else if("jpg".equals(s)){
//                response.addHeader("Content-Type","image/jpeg");
//            }

            Map<String,String> map = new HashMap<>();
            String s1 = name.substring(name.lastIndexOf(".")+1);
            map.put("html","text/html");
            map.put("css","text/css");
            map.put("js","application/javascript");
            map.put("png","image/png");
            map.put("gif","image/gif");
            map.put("jpg","image/jpeg");
            response.addHeader("Content-Type",map.get(s1));

//            String fileName = file.getName();
//            String ext = fileName.substring(fileName.lastIndexOf(".")+1);
//            String mime = mimeMapping.get(ext);
//            response.addHeader("Content-Type",mime);


            //response.addHeader("Content-Type","????/????");
            response.addHeader("Content-Length",file.length()+"");

        }else {//1.文件不存在2.是一个目录
            response.setStatusCode(404);
            response.setStatusReason("NotFound");
            file = new File(staticDir,"/root/404.html");
            response.setContentFile(file);

            response.addHeader("Content-Type","text/html");
            response.addHeader("Content-Length",file.length()+"");
        }
    }
}
